package mashibing.freshman.class04;

/**
 * @author: Shelly
 * @create: 2023-01-05 21:52:45
 * @describe:
 * 链表需要考虑边界条件
 * 链表就是纯coding
 *
 * 逻辑：记下环境，调整现在的
 */
public class Code01_ReverseList {
    // 单链表
    public static class Node {
        public int value;
        public Node next;// 指向下一个Node：下一个内存地址

        public Node(int data) {
            value = data;
        }
    }
    // 双链表
    public static class DoubleNode {
        public int value;
        public DoubleNode last;// 前一个
        public DoubleNode next;// 后一个

        public DoubleNode(int data) {
            value = data;
        }
    }
    /////////////////////////////////////////////////////////////////////////////////
    // 单链表的反转
    public static Node reverseLinkedList(Node head) {
        Node pre = null;
        Node next = null;
        while (head != null) {
            next = head.next;// 记录下一个值，防止JVM将其内存释放
            head.next = pre;
            pre = head;
            head = next;
        }
        return pre;
    }

    // 双链表的反转
    public static DoubleNode reverseDoubleList(DoubleNode head) {
        DoubleNode pre = null;
        DoubleNode next = null;
        while (head != null) {// 停止条件
            next = head.next;
            head.next = pre;
            head.last = next;// 比单链表的反转多了这一句
            pre = head;
            head = next;
        }
        return pre;
    }

    // 测试
    public static void main(String[] args) {
        Node n1 = new Node(1);
        n1.next = new Node(2);
        n1.next.next = new Node(3);
        f(n1);
        System.out.println(n1.value);

        // 单链表测试


        // 双链表测试

    }

    // 【引用的传递】进入f（）的n1和上游的n1不是一个东西，是上游n1的拷贝
    public static void f(Node head){
        head = head.next;
    }
}
